/**
 * 文件名：@AbstractNestedValueParser.java <br/>
 * 包名：cn.efunbox.afw.core.mvc.result <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.mvc.result;

import java.util.Map;

import org.apache.commons.beanutils.NestedNullException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 类名：AbstractNestedValueParser  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月3日 下午5:59:30  <br />
 * @version 2015年12月3日
 */
public abstract class AbstractNestedValueParser implements ValueParser {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(AbstractNestedValueParser.class);

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月3日 下午5:59:47<br/>
	 * 
	 * @param root
	 * @param property
	 * @param params
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.mvc.result.ValueParser#parse(java.lang.Object, java.lang.String, java.util.Map)
	 */
	@Override
	public Object parse(Object root, String property, Map<String, Object> params) throws Exception {
		Object value = null;
		try {
			// 读取属性值
			value = PropertyUtils.getProperty(root, property);
		} catch (NestedNullException e) {
			logger.warn(e.getMessage());
		}
		
		logger.debug("the read value is : " + value);
		
		// 交给子类处理
		value = doParse(root, property, value, params);
		
		logger.debug("after doParse value is : " + value);
		
		return value;
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月3日 下午6:00:43 <br/>
	 */
	protected abstract Object doParse(Object root, String property, Object value, Map<String, Object> params);
}
